import { _decorator, Component, Node, Sprite, UITransform } from 'cc'
import { TILE_CONFIGS } from '../utils/constants'
import { DIRECTION_ENUM, DIRECTION_ORDER_ENUM, ENTITY_STATE_ENUM, ENTITY_TYPE_ENUM } from '../enums'
import { IEntity } from '../levels'
import { StateMachine } from './StateMachine'
import { generateUUID } from '../utils'
const { ccclass, property } = _decorator
/** 实体类 比如玩家 怪物Manager类的基类 */

@ccclass('EntityMgr')
export class EntityMgr extends Component {
  /** 实体id */
  id: string = generateUUID()
  /** 当前实体X轴位置 */
  x: number = 0
  /** 当前实体Y轴位置 */
  y: number = 0
  /** 状态机 */
  fsm: StateMachine
  /** 实体类型 */
  type: ENTITY_TYPE_ENUM

  /** 方向 */
  private _direction: DIRECTION_ENUM
  public get direction(): DIRECTION_ENUM {
    return this._direction
  }
  public set direction(value: DIRECTION_ENUM) {
    this._direction = value

    this.fsm.setParams(ENTITY_STATE_ENUM.DIRECTION, DIRECTION_ORDER_ENUM[value]) // 通过当前状态触发动画的执行 使数据和UI进行分离
  }

  /** 当前状态 */
  private _state: ENTITY_STATE_ENUM
  public get state(): ENTITY_STATE_ENUM {
    return this._state
  }
  public set state(value: ENTITY_STATE_ENUM) {
    this._state = value
    this.fsm.setParams(value, true) // 通过当前状态触发动画的执行 使数据和UI进行分离
  }

  async init(params: IEntity) {
    // 添加精灵组件
    const sprite = this.addComponent(Sprite)
    sprite.sizeMode = Sprite.SizeMode.CUSTOM // 设置精灵大小模式为自定义
    // 设置组件大小为瓦片的4倍
    const transform = this.getComponent(UITransform)
    transform.setContentSize(TILE_CONFIGS.TILE_WIDTH * 4, TILE_CONFIGS.TILE_HEIGHT * 4)

    // 接收外部传递的参数
    this.x = params.x
    this.y = params.y
    this.type = params.type
    this.direction = params.direction // 设置初始方向为上 会触发set 函数中的逻辑
    this.state = params.state // 设置当前状态为IDLE 触发set中的动画执行逻辑代码 实现数据和UI分离
  }

  update() {
    // 横纵坐标要偏移1.5个瓦片才会在目标位置
    this.node.setPosition(
      this.x * TILE_CONFIGS.TILE_WIDTH - TILE_CONFIGS.TILE_WIDTH * 1.5,
      this.y * TILE_CONFIGS.TILE_HEIGHT + TILE_CONFIGS.TILE_HEIGHT * 1.5,
    )
  }
}
